#include "mprpcconfig.h"

#include <iostream>
#include <string>

// 负责解析加载配置文件

void MprpcConfig::LoadConfigFilePath(const char *configFilePath) {
    // 打开文件
    FILE *pf = fopen(configFilePath, "r");
    if (!pf) {
        std::cerr << configFilePath << " does not exist or cannot be opened!" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 解析文件内容
    char buf[512] = {0};
    while (fgets(buf, 512, pf) != nullptr) {
        std::string line(buf);

        // 去除首尾空格
        Trim(line);

        // 跳过注释和空行
        if (line.empty() || line[0] == '#') continue;

        // 解析配置项
        size_t idx = line.find('=');
        if (idx == std::string::npos) continue; // 非法配置项

        std::string key = line.substr(0, idx);
        Trim(key);
        int endidx = line.find('\n', idx);
        std::string value = line.substr(idx + 1, endidx - idx - 1);
        Trim(value);

        // 插入键值对到配置表中
        // 检查是否已经有相同的键存在
        if (m_configMap.find(key) != m_configMap.end()) {
            std::cout << "Warning: Duplicate key found: " << key << ". Overwriting." << std::endl;
        }
        m_configMap[key] = value;
    }

    // 关闭文件
    fclose(pf);
}

// 查询配置项信息
std::string MprpcConfig::load(const std::string &key)
{
    auto it = m_configMap.find(key);
    if (it == m_configMap.end())
    {
        return "";
    }
    return it->second;
}

// 去掉字符串前后的空格
void MprpcConfig::Trim(std::string &line) {
    // 去除前面的空格
    if (line.empty()) return;
    int idx = line.find_first_not_of(' ');
    if (idx != std::string::npos) {
        line = line.substr(idx);
    }

    // 去除后面的空格
    idx = line.find_last_not_of(' ');
    if (idx != std::string::npos) {
        line = line.substr(0, idx + 1);
    }
}